package com.briup.bookstore.mapper;

import com.briup.bookstore.domain.bean.Book;
import com.briup.bookstore.domain.vo.BookDetailVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.Collection;
import java.util.List;

@Mapper
public interface BookMapper {

    /**
     * 查询所有已经上架的图书
     *
     * @return 所有已经上架的图书列表
     */
    List<Book> queryAllEnabled();

    /**
     * 根据图书分类ID查询图书列表
     *
     * @param categoryId 图书分类ID
     * @return 图书列表
     */
    List<Book> queryByCategoryId(Integer categoryId);

    /**
     * 根据书名、作者、出版社等关键字查找图书信息
     *
     * @param query 关键字
     * @return 图书列表
     */
    List<Book> searchBook(String query);

    /**
     * 根据图书ID查询图书详情，包含用户是否收藏该图书的信息
     *
     * @param id     图书ID
     * @param userId 用户ID
     * @return 图书详情VO对象
     */
    BookDetailVO queryByIdWithUserId(@Param("id") Integer id,
                                     @Param("userId") Integer userId);

    /**
     * 根据图书ID和图书状态查询图书信息，
     * 如果status为null，则不需要根据状态查询
     *
     * @param bookId 图书ID
     * @param status 图书状态，0表示上架，1表示下架
     * @return 图书对象
     */
    Book queryById(@Param("bookId") Integer bookId,
                   @Param("status") Integer status);

    /**
     * 根据图书ID列表查询图书列表
     *
     * @param bookIds 图书ID列表
     * @return 图书列表
     */
    List<Book> queryByIds(Collection<Integer> bookIds);

    /**
     * 根据图书ID和库存数量更新图书库存数量
     *
     * @param bookId   图书ID
     * @param storeNum 库存数量
     */
    void updateStock(@Param("bookId") Integer bookId, @Param("storeNum") Integer storeNum);
}
